MapStruct হল একটি কোড জেনারেটর লাইব্রেরি যা compile-time এ ডোমেইন অবজেক্ট এবং DTO (Data Transfer Object) এর মধ্যে ম্যাপিং কোড জেনারেট করে। এটি দ্রুত এবং টাইপ-সেফ ম্যাপিং প্রদান করে। MapStruct ব্যবহার করে আপনি Field Mapping এবং Custom Mapping করতে পারেন, যেখানে কিছু ক্ষেত্র ডোমেইন অবজেক্ট থেকে অন্য অবজেক্টে সরাসরি ম্যাপ হয় এবং কিছু ক্ষেত্রে কাস্টম ম্যাপিং ব্যবহার করতে হয়।
এই টিউটোরিয়ালে, আমরা Field Mapping এবং Custom Mapping এর দুটি বাস্তব উদাহরণ দেখব।
১. Field Mapping (ফিল্ড ম্যাপিং)
Field Mapping হল এমন একটি প্রক্রিয়া যেখানে দুটি অবজেক্টের মধ্যে ফিল্ডের মান সরাসরি কপি করা হয়। MapStruct এটি খুব সহজে এবং দ্রুত করে, যেহেতু এটি compile-time এ কোড জেনারেট করে।
উদাহরণ: Simple Field Mapping
ধরা যাক, আমাদের দুটি ক্লাস Employee এবং EmployeeDTO রয়েছে, এবং আমরা তাদের মধ্যে ফিল্ড ম্যাপিং করতে চাই।
Employee.java (Domain Object)
public class Employee {
private String name;
private int age;
private String department;
// Getters and Setters
}
EmployeeDTO.java (DTO)
public class EmployeeDTO {
private String name;
private int age;
private String department;
// Getters and Setters
}
এখন, MapStruct এর মাধ্যমে Employee থেকে EmployeeDTO তে ফিল্ড ম্যাপিং করতে হবে। MapStruct সাধারণত field names এর মধ্যে মিল খুঁজে ম্যাপিং করে দেয়।
EmployeeMapper.java (Mapper Interface)
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface EmployeeMapper {
EmployeeMapper INSTANCE = Mappers.getMapper(EmployeeMapper.class);
// Simple field-to-field mapping
EmployeeDTO employeeToEmployeeDTO(Employee employee);
}
এখানে, employeeToEmployeeDTO মেথডটি Employee অবজেক্ট থেকে EmployeeDTO অবজেক্টে ফিল্ড ম্যাপিং করে। MapStruct কোড জেনারেট করে যে name, age, এবং department ফিল্ডগুলির মান সরাসরি ম্যাপ করা হবে।
Main.java (Usage Example)
public class Main {
public static void main(String[] args) {
Employee employee = new Employee();
employee.setName("John");
employee.setAge(30);
employee.setDepartment("Engineering");
// Using MapStruct Mapper to map Employee to EmployeeDTO
EmployeeDTO employeeDTO = EmployeeMapper.INSTANCE.employeeToEmployeeDTO(employee);
System.out.println("Name: " + employeeDTO.getName());
System.out.println("Age: " + employeeDTO.getAge());
System.out.println("Department: " + employeeDTO.getDepartment());
}
}
এখানে, MapStruct মেথড employeeToEmployeeDTO কে কল করে Employee থেকে EmployeeDTO তে ফিল্ড ম্যাপিং সম্পন্ন করবে।
২. Custom Mapping (কাস্টম ম্যাপিং)
Custom Mapping হল এমন একটি প্রক্রিয়া যেখানে আপনি কিছু ফিল্ডের মান কাস্টমভাবে ম্যাপ করতে পারেন, যেমন কোনো বিশেষ রূপান্তর বা ডেটা কনভার্শন। MapStruct আপনাকে custom mapping করার সুযোগ দেয়, যেখানে আপনি নিজের কাস্টম কনভার্টার বা লজিক প্রয়োগ করতে পারেন।
উদাহরণ: Custom Mapping
ধরা যাক, আমাদের Person অবজেক্টে fullName ফিল্ডটি আছে, এবং আমরা চাই যে এটি firstName এবং lastName ফিল্ডে ভেঙে ম্যাপ করা হোক।
Person.java (Domain Object)
public class Person {
private String fullName;
// Getters and Setters
}
PersonDTO.java (DTO)
public class PersonDTO {
private String firstName;
private String lastName;
// Getters and Setters
}
এখন, MapStruct ব্যবহার করে Person এর fullName থেকে PersonDTO এর firstName এবং lastName এ ডেটা ভেঙে ম্যাপ করতে হবে।
PersonMapper.java (Mapper Interface with Custom Mapping)
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper
public interface PersonMapper {
// Custom mapping: Split fullName into firstName and lastName
@Mapping(source = "fullName", target = "firstName",
qualifiedByName = "splitFullNameFirstName")
@Mapping(source = "fullName", target = "lastName",
qualifiedByName = "splitFullNameLastName")
PersonDTO personToPersonDTO(Person person);
// Custom method to extract first name from full name
default String splitFullNameFirstName(String fullName) {
return fullName != null ? fullName.split(" ")[0] : null;
}
// Custom method to extract last name from full name
default String splitFullNameLastName(String fullName) {
return fullName != null ? fullName.split(" ")[1] : null;
}
}
এখানে, splitFullNameFirstName এবং splitFullNameLastName কাস্টম মেথড তৈরি করা হয়েছে যা fullName থেকে firstName এবং lastName একে অপরের মধ্যে আলাদা করবে।
Main.java (Usage Example)
public class Main {
public static void main(String[] args) {
Person person = new Person();
person.setFullName("John Doe");
// Using MapStruct Mapper to map Person to PersonDTO
PersonDTO personDTO = PersonMapper.INSTANCE.personToPersonDTO(person);
System.out.println("First Name: " + personDTO.getFirstName());
System.out.println("Last Name: " + personDTO.getLastName());
}
}
এখানে, fullName এর মান "John Doe" কে firstName ("John") এবং lastName ("Doe") তে কাস্টম ম্যাপ করা হবে।
৩. MapStruct এর অন্যান্য কাস্টম ম্যাপিং পদ্ধতি
MapStruct আরও কিছু কাস্টম ম্যাপিং পদ্ধতি প্রদান করে যা ব্যবহার করে আপনি জটিল লজিক প্রয়োগ করতে পারেন। উদাহরণস্বরূপ:
- Expression: ডেটার মান ম্যাপিং করতে এক্সপ্রেশন ব্যবহার করা।
- Iterable and Array Mapping: তালিকা বা অ্যারে ম্যাপিং করতে কাস্টম লজিক ব্যবহার করা।
- Enum Mapping: এনাম টাইপের মান ম্যাপিং করা।
উদাহরণ: Expression Mapping
@Mapping(source = "age", target = "ageInMonths", expression = "java(person.getAge() * 12)")
PersonDTO personToPersonDTO(Person person);
এখানে, age ফিল্ডের মান ageInMonths ফিল্ডে কাস্টম এক্সপ্রেশনের মাধ্যমে ম্যাপ করা হয়েছে।
সারাংশ
MapStruct ব্যবহার করে আপনি সহজেই Field Mapping এবং Custom Mapping করতে পারেন। Field Mapping সাধারণত সরাসরি ফিল্ডের মান কপি করে, যেখানে Custom Mapping আপনাকে কাস্টম লজিক প্রয়োগ করার সুযোগ দেয়। এটি MapStruct এর একটি শক্তিশালী বৈশিষ্ট্য যা আপনার ডেটা ট্রান্সফার লজিক আরও নমনীয় এবং পারফরম্যান্সে উন্নত করে।
Read more